package cliente;

import javax.swing.JFrame;

import servidor.GestorBDUsuarios;
import servidor.PanelPrincipal;
import utilidad.SocketManager;

import java.awt.CardLayout;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.StringTokenizer;

import javax.swing.BoxLayout;

import java.awt.BorderLayout;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

import excepciones.ObtenerFotoException;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class VentanaPrincipal extends JFrame {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private SocketManager sm;
	public static final JButton btnObtenerFoto = new JButton("Obtener Foto");
	public static final JButton btnActuar = new JButton("Actuar");
	private VentanaPrincipal vP;
	private static PanelListado panelList;
	private static PanelFoto panelFoto;
	public JButton btnListaVariables = new JButton("Lista variables");
	public static String variableAccion="";
	public static String placaAccion="";
	
	/**
	 * Create the frame.
	 */
	public VentanaPrincipal(final SocketManager sm) {
		vP=this;
		vP.dispose();
		this.sm = sm;
		JPanel panelPrincipal=new JPanel();
		this.setContentPane(panelPrincipal);
		setTitle(".:: Control Invernadero ::.");
		setSize(615, 515);
		setLocationRelativeTo(null);
		setVisible(true);
//		setResizable(false);
		//setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		panelPrincipal.setLayout(new BorderLayout(0, 0));
		this.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
		panelFoto = new PanelFoto();
		btnListaVariables.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				panelFoto.setVisible(false);
				btnListaVariables.setVisible(false);
				panelList.setVisible(true);
				
			}
		});
		btnListaVariables.setVisible(false);
	
//		btnLogOut.setBounds(530, 22, 60, 60);
//		add(btnLogOut);
		
		JPanel panelBotonera = new JPanel();
		panelPrincipal.add(panelBotonera, BorderLayout.SOUTH);
		btnObtenerFoto.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				panelList.setVisible(false);
				panelFoto.setVisible(true);
				btnListaVariables.setVisible(true);
				String id_placa=(String) panelList.dtm.getValueAt(panelList.tabla.getSelectedRow(), 0);
				File imagen= new File("imagenesCliente/"+id_placa+".jpg");
				if(!imagen.exists())
				{
				String sentenciaEnviar="OBTENER_FOTO "+id_placa;
				String codigo = "";
				try {
					try{
					sm.Escribir(sentenciaEnviar+'\n');
					}
					catch(SocketException e)
					{
						JOptionPane.showMessageDialog(null, "Parece que el administrador del servidor le ha cerrado la conexión. Intente conectarse más tarde.", "¡Ups!", JOptionPane.ERROR_MESSAGE);
						System.exit(0);
					}
					String sentenciaRecibida = sm.Leer();
					System.out.println("[FOTO] Sentencia recibida: "+sentenciaRecibida);
					StringTokenizer tokens = new StringTokenizer(sentenciaRecibida);
			        codigo =(String) tokens.nextElement();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				if(codigo.startsWith("206"))
				{
					// Creo una carpeta para que contenga la imagen que necesitamos
					File carpetaContenedora=new File("imagenesCliente");
					carpetaContenedora.mkdir();
					byte[] buffer = new byte[1024];
        		    int bytes = 0;
        		    DataInputStream datas=new DataInputStream(sm.obtenerInputStream());
        		    FileOutputStream outs = null;
					try {
						outs = new FileOutputStream("imagenesCliente/"+id_placa+".jpg");
					} catch (FileNotFoundException e1) {
						System.out.println("[FOTO]     NO ENCONTRADA");
						e1.printStackTrace();
					}
        		    
        		    	try {
        		    		bytes = datas.read(buffer);
        		    		int disponible=1;
        		    		 while(disponible!=0){
        		    			 System.out.println("Disponible: "+datas.available());
        		    			 System.out.println("ESTOY AQUI");
							outs.write(buffer);
							bytes = datas.read(buffer);
							disponible=datas.available();
        		    	}
        		    		 outs.write(buffer);
        		    		 System.out.println("sali del bucle");
							 outs.flush();
			                 outs.close();
			                 System.out.println("he cerrado todo");
						} catch (IOException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}  //Saca del fichero de mil veinti cuatro a mil veinticuatro.	
				}
				else
				{
					try {
						throw new ObtenerFotoException();
					} catch (ObtenerFotoException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
				}
				else
				{
					System.out.println("LA imagen ya existe");
				}
				ImageIcon imagenObtenida= new ImageIcon("imagenesCliente/"+id_placa+".jpg");
				System.out.println("FINALIZADO");
				panelFoto.setFotoActual(imagenObtenida);			
			}
		});
		//panelBotonera.setLayout(null);
		btnObtenerFoto.setBounds(70, -52, 125, 30);
		panelBotonera.add(btnObtenerFoto);
		
		btnActuar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				ArrayList <String> lineastemp = new ArrayList<String>();
				boolean nofin=false;
				variableAccion=(String) panelList.dtm.getValueAt(panelList.tabla.getSelectedRow(), 1);
				placaAccion=(String) panelList.dtm.getValueAt(panelList.tabla.getSelectedRow(), 0);
				try {
					
					try{
						sm.Escribir("OBTENER_ACCIONES "+(String)(panelList.dtm.getValueAt(panelList.tabla.getSelectedRow(), 0))+" "+
								panelList.dtm.getValueAt(panelList.tabla.getSelectedRow(), 1)+'\n');
						}
						catch(SocketException e)
						{
							JOptionPane.showMessageDialog(null, "Parece que el administrador del servidor le ha cerrado la conexión. Intente conectarse más tarde.", "¡Ups!", JOptionPane.ERROR_MESSAGE);
							System.exit(0);
						}
					while(!nofin)
					{
							String temporal=sm.Leer();
							System.out.println("ESTE ESSS "+temporal);
							if(temporal.equals("202 FINACCIONES"))
							{
								nofin=true;
							}
							else
							{
								lineastemp.add(temporal);
							}
					}
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
					//String sentenciaRecibida = sm.Leer();
				
				VentanaElegirAccion vEA = new VentanaElegirAccion(lineastemp, sm, panelList);
				vEA.setVisible(true);
			}
			});
		btnActuar.setBounds(230, -52, 125, 30);
		panelBotonera.add(btnActuar);
		
		
		JButton btnBuscar = new JButton("Buscar");
		btnBuscar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				VentanaBuscarVariable vBuscVar = new VentanaBuscarVariable(sm);
				vBuscVar.setVisible(true);
			}
		});
		
		btnBuscar.setBounds(390, -52, 125, 30);
		panelBotonera.add(btnBuscar);
		
		JPanel panelSuperior = new JPanel();
		panelPrincipal.add(panelSuperior, BorderLayout.NORTH);
		//panelSuperior.setLayout(null);
		
		
		
		ImageIcon iLogOut = new ImageIcon("imagenes/logout.png");
		JButton btnLogOut = new JButton(iLogOut);
		btnLogOut.setBounds(15, 16, 60, 60);
		panelSuperior.add(btnLogOut);
		btnLogOut.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				try {
					try{
						sm.Escribir("SALIR" + '\n');
						}
						catch(SocketException e)
						{
							JOptionPane.showMessageDialog(null, "Parece que el administrador del servidor le ha cerrado la conexión. Intente conectarse más tarde.", "¡Ups!", JOptionPane.ERROR_MESSAGE);
							System.exit(0);
						}
					
					String sentenciaRecibida = sm.Leer();
					System.out.println("[SALIR] Sentencia recibida: "+sentenciaRecibida);
					StringTokenizer tokens = new StringTokenizer(sentenciaRecibida);
			        String codigo =(String) tokens.nextElement();
			        if(codigo.equals("208"))
			        {
			        	sm.CerrarSocket();
						sm.CerrarStreams();
						
						dispose();
						VentanaCliente vC = new VentanaCliente();
						vC.setEnabled(true);
			        }
			        else
			        {
			        	throw new IOException();
			        	
			        }
					
				} catch (IOException e) {
					
					System.out.println("[BD]   No se ha podido desconectar correctamente.");
					JOptionPane.showMessageDialog(null, "Parece que el administrador del servidor le ha cerrado la conexión. Intente conectarse más tarde.", "¡Ups!", JOptionPane.ERROR_MESSAGE);
					System.exit(0);
				}
			}
		});
		
		JPanel panelCentral = new JPanel();
		panelPrincipal.add(panelCentral, BorderLayout.CENTER);
		panelCentral.setLayout(new CardLayout(0, 0));
		panelList = new PanelListado(sm);
		panelCentral.add(panelList);
		panelCentral.add(panelFoto);
		btnActuar.setEnabled(false);
		btnObtenerFoto.setEnabled(false);	
		
		
		panelBotonera.add(btnListaVariables);
		
		panelBotonera.setVisible(true);
		panelCentral.setVisible(true);
		panelSuperior.setVisible(true);
		
		 // Cierre
        this.addWindowListener(new WindowAdapter() {

                public void windowClosing(WindowEvent we) {

                        int eleccion = JOptionPane.showConfirmDialog(null,
                                        "�Est� seguro que quieres salir de la aplicaci�n?",
                                        "Saliendo del programa", 0,
                                        JOptionPane.WARNING_MESSAGE);
                        System.out.println(eleccion);

                        if (eleccion == 0) {// Confirma que quiere salir
                                JOptionPane.showMessageDialog(null,
                                                "Saliendo del programa.",
                                                "Cierre del programa", 0);
                                try {
                                	try{
                						sm.Escribir("SALIR" + '\n');
                						}
                						catch(SocketException e)
                						{
                							JOptionPane.showMessageDialog(null, "Parece que el administrador del servidor le ha cerrado la conexión. Intente conectarse más tarde.", "¡Ups!", JOptionPane.ERROR_MESSAGE);
                							System.exit(0);
                						}
									String sentenciaRecibida = sm.Leer();
									System.out.println("[SALIR] Sentencia recibida: "+sentenciaRecibida);
									StringTokenizer tokens = new StringTokenizer(sentenciaRecibida);
							        String codigo =(String) tokens.nextElement();
							        if(codigo.equals("208"))
							        {
							        	sm.CerrarSocket();
										sm.CerrarStreams();
										System.exit(0);
							        }
							        else
							        {
							        	throw new IOException();
							        }
									
								} catch (IOException e) {
									System.out.println("[BD]   No se ha podido desconectar correctamente.");
								}
                                
                        }
                }
        });
		
	}
}
